
from tkinter import messagebox, END, Tk, filedialog
from tkinter.ttk import Combobox

import ttkbootstrap as ttk
from ttkbootstrap.constants import *
import tkinter as tk

class Sun_tkinter:

    def __init__(self):
        pass

    # 创建一个tk窗口对象
    def create_tk_window(self) -> Tk:
        return tk.Tk()

    # 创建一个tk窗口对象  ttk组件
    def create_ttk_window(self) -> Tk:
        return ttk.Window()

    # 创建一个tk窗口风格对象  ttk组件
    def create_ttk_style(self) -> Tk:
        return ttk.Style()

    # 展示tk窗口对象
    def show_tk_window(self,tks):
        tk.mainloop()

    # 设置窗口标题
    def set_window_title(self,tk_window,title):
        tk_window.title(title)

    # 设置窗口大小 及 窗口打开的位置
    def set_window_size(self,tk_window,width,height,x_position=0,y_position=0):
        tk_window.geometry(f"{width}x{height}+{x_position}+{y_position}")

    # 设置窗口长宽是否锁定大小  False 窗口大小不可变
    def set_window_size_lock_status(self,tk_window,width_lock_status,height_lock_status):
        tk_window.resizable(width_lock_status,height_lock_status)

    # 设置窗口icon图标
    def set_window_icon(self,tk_window,icon_path):
        tk_window.iconbitmap(icon_path)

    # 设置窗口北京颜色 #000000
    def set_window_background_color(self,tk_window,color):
        tk_window.configure(bg=color)

    # 设置窗口透明度  0到1之间
    def set_window_transparent_percentage(self,tk_window,percentage):
        tk_window.attributes('-alpha',percentage)

    # 设置窗口是否始终置顶
    def set_window_locate_top(self,tk_window,status):
        tk_window.attributes('-topmost', status)

    # 设置点击窗口关闭按钮时，触发的事件函数，设置后，不会关闭，默认情况是销毁窗口
    def set_close_window_callback(self,tk_window,func):
        tk_window.protocol("WM_DELETE_WINDOW",func)

    # 销毁窗口
    def delete_tk_window(self,tk_window):
        tk_window.destroy()

    # 创建标签组件对象  fg文字颜色 bg背景颜色  原生组件
    def create_tk_label(self,tk_window,text,width=10,height=5,font=15,fg=None,bg=None,style="黑体"):
        return tk.Label(tk_window,width=width,height=height,text=text,font=(style,font),fg=fg,bg=bg)

    # 创建标签组件对象，ttk组件  "info","inverse","inverse-danger","warning"
    def create_ttk_label(self,tk_window,text,bootstyle=INFO,font="微软雅黑",text_size=15,width=10):
        return ttk.Label(tk_window,width=width,text=text,bootstyle=bootstyle,font=(font, text_size))

    # pack方式放置组件   从上往下 居中摆放组件
    def hand_tk_element_pack(self,tk_element):
        tk_element.pack()

    # place方式放置组件  自己设置在窗口内的哪个位置摆放
    def hand_tk_element_place(self,tk_element,x,y):
        tk_element.place(x=x,y=y)

    # grid方式放置组件  按照表格方式摆放 自己设置放第几行 第几列，如果前面行或列无内容时 自动向前放
    def hand_tk_element_grid(self,tk_element,row,col,row_skip_num=None,column_skip_num=None):
        tk_element.grid(row=row,column=col,columnspan=column_skip_num,rowspan=row_skip_num)

    # 创建输入框组件对象  fg文字颜色 bg背景颜色  原生
    def create_tk_entry(self,tk_window,width=20,font=20,fg=None,bg=None,default_message=None,style="黑体"):
        return tk.Entry(tk_window,textvariable=default_message,width=width,font=(style,font),fg=fg,bg=bg)

    # 创建输入框组件对象  ttk   "success","primary",不传
    def create_ttk_entry(self,tk_window,bind_str,width=30,bootstyle = (PRIMARY, "outline-toolbutton"), font = "微软雅黑", text_size = 10):
        return ttk.Entry(tk_window,textvariable=bind_str,width=width, bootstyle=bootstyle,font=(font, text_size))


    # 创建字符串对象  用于赋值给其他组件属性，动态的显示/获取字符串的值
    def create_tk_string(self):
        return tk.StringVar()

    # 设置字符串对象值
    def set_tk_string_value(self,tk_str,value):
        tk_str.set(value)

    # 获取字符串对象的值
    def get_tk_string_value(self,tk_str):
        return tk_str.get()

    # 创建按钮组件对象    原生
    def create_tk_button(self,tk_window,text,func=None,width=5,height=5,font=15,fg=None,bg=None,style="黑体"):
        return tk.Button(tk_window,command=func,width=width,height=height,text=text,font=(style,font),fg=fg,bg=bg)

    # 创建按钮组件对象  ttk组件   (INFO, OUTLINE)
    def create_ttk_button(self,tk_window,text,callback,bootstyle=(INFO),width=10):
        return ttk.Button(tk_window, text=text,bootstyle=bootstyle,width=width,command=callback,)

    # 弹出提示框
    def pop_err_tip(self,err_title,err_message,method="error"):
        if method == "error":
            messagebox.showerror(title=err_title,message=err_message)
            return True
        if method == "info":
            messagebox.showinfo(title=err_title,message=err_message)
            return True
        if method == "warning":
            messagebox.showwarning(title=err_title,message=err_message)
            return True
        if method == "cancel":
            result = messagebox.askokcancel(title=err_title,message=err_message)
            return result

    # 创建菜单栏对象
    def create_tk_menu(self,tk_window):
        return tk.Menu(tk_window)

    # 添加菜单栏元素
    def add_tk_menu_element(self,tk_menu,name,tk_low_menu=None):
        tk_menu.add_cascade(label=name,menu=tk_low_menu)

    # 创建下级菜单对象
    def create_tk_low_menu(self,tk_menu):
        return tk.Menu(tk_menu,tearoff=0)

    # 添加下级菜单元素
    def add_tk_low_menu_element(self,tk_low_menu,name,func=None):
        tk_low_menu.add_command(label=name,command=func)

    # 展示菜单栏
    def show_tk_menu(self,tk_window,tk_menu):
        tk_window.config(menu=tk_menu)


    # 创建下拉框对象 回调函数需要一个参数 原生组件
    def create_tk_dropbox(self,tk_window,option,default_message=None,width=20,height=5,font=15,func=None,style="黑体"):
        dropbox = Combobox(tk_window,width=width,height=height,textvariable=default_message,values=option,font=(style,font),state="readonly")
        dropbox.bind("<<ComboboxSelected>>", func)
        return dropbox

    # 创建下拉框对象 回调函数需要一个参数  ttk组件
    def create_ttk_dropbox(self,tk_window,options,bind_str,width=30,bootstyle=(PRIMARY, "outline-toolbutton"),font="微软雅黑",text_size=10):
        return ttk.Combobox(tk_window,values=options,textvariable=bind_str,width=width,bootstyle=bootstyle,font=(font, text_size))

    # 创建子窗口 创建时候就已经显示了
    def create_child_tk_window(self):
        return ttk.Toplevel()

    # 焦点设置到目标窗口
    def set_window_focus(self,window):
        window.focus_set()

    # 创建单选框组件对象
    def create_tk_radiobox(self,tk_window,text,bind_str,font=15,style="黑体"):
        return tk.Radiobutton(tk_window,text=text,variable=bind_str,value=text,font=(style,font))

    # 创建多选框组件对象
    def create_tk_checkbox(self, tk_window, text, bind_str, font=15, style="黑体"):
        return tk.Checkbutton(tk_window, text=text, variable=bind_str, onvalue=text, offvalue=None,font=(style, font))

    # 创建文本框对象 原生组件
    def create_tk_text(self,tk_window,style="黑体",font=15,width=40,height=20):
        return tk.Text(tk_window,font=(style,font),width=width,height=height)

    # 创建文本框对象 ttk组件
    def create_ttk_text(self,tk_window,font=15, style="黑体",width=20,height=20):
        return ttk.Text(tk_window,font=(style, font),width=width,height=height)

    # 往列表中追加添加内容 不换行
    def add_data_in_tk_text(self,tk_text,data):
        tk_text.insert(tk.END,data)

    # 清空列表
    def clear_data_in_tk_text(self,tk_text):
        tk_text.delete(1.0, tk.END)

    # 设置关闭窗口时，触发的点击事件
    def set_close_window_callback(self,tk_window,func):
        tk_window.protocol("WM_DELETE_WINDOW", func)

    # 获取文本框内容
    def get_text_input_data(self,tk_text):
        return tk_text.get("1.0", "end")

    def select_folder_get_path(self):
        folder_path = filedialog.askdirectory()
        print("选择的文件夹路径为：", folder_path)
        return folder_path

    def select_file_get_path(self):
        file_path = filedialog.askopenfilename()
        print("选择的文件路径为：", file_path)
        return file_path

    def selcet_files_get_path(self):
        files_path = filedialog.askopenfilenames()
        print("选择的文件路径列表为：", files_path)
        return files_path


